vulkan: Try combining draw calls
authorBenjamin Otte <otte@redhat.com>
Fri, 23 Dec 2016 21:19:56 +0000 (22:19 +0100)
committerBenjamin Otte <otte@redhat.com>
Sat, 24 Dec 2016 05:19:16 +0000 (06:19 +0100)
This gives a 5-7% speedup in the case where we're just drawing N colors
and nothing else. So it;s not tremendously useful, but noticeable.

gsk/gskvulkanrenderpass.c

index 5e91fe724d555d86c10adba041c142c00bef4206..e5a343a5e10821bf78b506d9d3664b7db9dbd56e 100644 (file)
@@ -372,11 +372,12 @@ gsk_vulkan_render_pass_draw (GskVulkanRenderPass     *self,
   GskVulkanPipeline *current_pipeline = NULL;
   gsize current_draw_index = 0;
   GskVulkanOp *op;
-  guint i;
+  guint i, step;
 
-  for (i = 0; i < self->render_ops->len; i++)
+  for (i = 0; i < self->render_ops->len; i += step)
     {
       op = &g_array_index (self->render_ops, GskVulkanOp, i);
+      step = 1;
 
       switch (op->type)
         {
@@ -432,9 +433,14 @@ gsk_vulkan_render_pass_draw (GskVulkanRenderPass     *self,
               current_draw_index = 0;
             }
 
+          for (step = 1; step + i < self->render_ops->len; step++)
+            {
+              if (g_array_index (self->render_ops, GskVulkanOp, i + step).type != GSK_VULKAN_OP_COLOR)
+                break;
+            }
           current_draw_index += gsk_vulkan_color_pipeline_draw (GSK_VULKAN_COLOR_PIPELINE (current_pipeline),
                                                                 command_buffer,
-                                                                current_draw_index, 1);
+                                                                current_draw_index, step);
           break;
 
         case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS: